<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>组件通信</title>
    <script src="./vue.js"></script>
  </head>
  <body>
    <div id="app">
      <parent></parent>
    </div>
  </body>
</html>
<script>
  // 组件通信
  // 1. 父向子传值
  // 1.1 父亲 通过属性给子组件传值
  // 1.2 儿子：通过props接受值
  // 2. 子向父传值 可以理解为 父给子传递一个函数或发布订阅
  // 2.1 父亲 通过v-on传递  v-on:yy="callback"
  // 2.2 儿子：通过$emit('yy', 6666)调用父亲给我传递的函数并传递参数
  // 也可以通过发布订阅方式理解：
  // 父亲订阅公众号v-on:yy="callback" 父亲订阅和儿子发布一定要是同一个公众号
  // 儿子通过公众号发布消息$emit('yy', 6666) yy就好比公众号
  // 3. 非父子通信 事件总线 非父子包含兄弟但不局限兄弟
  // 3.1 创建一个事件总线
  var bus = new Vue()
  // 3.2 发布消息 通过bus发布
  // 3.3 接受消息 通过bus接受
  // 4. 跨代传值 provie inject
  // 4.1 祖代： 通过provide给后代写遗嘱
  // 4.2 后代： 通过inject接受
  // 定义组件
  Vue.component('parent', {
    template: `<div>
      <h2>parent组件</h2>
      <child></child>
    </div>`
  })
  Vue.component('child', {
    inject: ['yizhu'],
    template: `<div>
      <h2>child组件--{{yizhu}}</h2>
      <son></son>
    </div>`
  })
  Vue.component('son', {
    // inject用法和props类似可以是一个数组也可以是对象
    inject: ['yizhu'],
    template: `<div>
      <h2>son组件--{{yizhu}}</h2>
    </div>`
  })
  var vm = new Vue({
    el: '#app',
    data: {
      money: 'er个亿'
    },
    provide () {
      return {
      // 类似于data 组件中也是一个函数
      // 4.1 祖代： 通过provide给后代写遗嘱
        yizhu: this.money
      }
    }
  })
</script>
